#ifndef _LRUCACHE_H_
#define _LRUCACHE_H_
#include <iostream>
#include <vector>
#include <unordered_map>
#include <unordered_set>
#include <string>
#include <nlohmann/json.hpp>
#include <list>
#include <fstream>
#include <sstream>
using std::ifstream;
using std::ios;
using std::list;
using std::ofstream;
using json = nlohmann::json;
using std::cout;
using std::endl;
using std::string;
using std::unordered_map;
using std::unordered_set;
using std::vector;

typedef struct Node
{
    Node *prev;
    Node *next;
    string key;
    vector<string> data;
    Node()
    {
        prev = nullptr;
        next = nullptr;
        data.reserve(5);
    }
    Node(string k, vector<string> v)
    : key(k)
    ,data(v)
    {
    }
} CacheNode;

class LRUCache
{
    friend class CacheManager;

private:
    int _size;//存的元素的个数
    int _capacity; // cache的容量
    CacheNode *_head;
    CacheNode *_last;
    //哈希存储
    unordered_map<string, CacheNode*> _keyMap;
    //list<CacheNode> _pendingList;

public:
    LRUCache(int capacity);
    //得到值，参数string，返回vector
    string get(string key);

    //屎山代码
    vector<string> JsonToV(string mes);
    string VtoJson(vector<string> vec);
    
    // 传入值，参数string关键字，vector<stirng> 五个推荐词
    void put(string key, string val);
    //以下是持久化操作
    //从文件中读取缓存信息
    void readFromFile(const string &filename);

    //将缓存信息写入到文件当中
    void writeToFile(const string &filename);

    //更新缓存信息
    void update(const LRUCache &rhs);

    //获取待更新的结点list
    LRUCache &getPendingList();

    //合并缓存
    void mergePending(const LRUCache &rhs);

    //添加缓存数据
    void addPendingELement(const string &key, const vector<string> &value);

    //查找Cache中是否存在该词
    bool search(string key);
};

#endif